package edu.hrbeu.crc.common.utils;

import edu.hrbeu.crc.constant.BillStatus;
import edu.hrbeu.crc.pojo.dto.BillDTO;
import edu.hrbeu.crc.pojo.entity.Bill;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.xssf.usermodel.*;

import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;
import java.util.Map;

public class ExcelUtil {


    /**
     * 获取或创建行
     * @param sheet
     * @param rowIndex
     * @return XSSFRow
     */
    public static XSSFRow getOrCreateRow(XSSFSheet sheet, int rowIndex) {
        // 检查行索引是否合法（不能为负数）
        if (rowIndex < 0) {
            throw new IllegalArgumentException("行索引不能为负数: " + rowIndex);
        }
        XSSFRow row = sheet.getRow(rowIndex);
        if (row == null) {
            row = sheet.createRow(rowIndex);  // 行不存在时创建新行
        }
        return row;
    }

    /**
     * 获取或创建单元格，并设置单元格格式
     * @param row
     * @param columnIndex
     * @param style
     * @return
     */
    public static XSSFCell getOrCreateCell(XSSFRow row, int columnIndex, XSSFCellStyle style) {
        XSSFCell cell = row.getCell(columnIndex);
        if (cell == null) {
            cell = row.createCell(columnIndex);  // 单元格不存在时创建
        }
        cell.setCellStyle(style);
        return cell;
    }

    /**
     * 创建通用单元格样式（宋体、11号、水平居中、垂直居中）
     * @param workbook
     * @return
     */
    public static XSSFCellStyle createCommonCellStyle(XSSFWorkbook workbook) {
        // 1. 创建字体对象（宋体、11号）
        XSSFFont font = workbook.createFont();
        font.setFontName("宋体");        // 字体名称
        font.setFontHeightInPoints((short) 11);  // 字号（11号）
        // 2. 创建单元格样式对象
        XSSFCellStyle style = workbook.createCellStyle();
        // 3. 设置字体
        style.setFont(font);
        // 4. 设置水平居中
        style.setAlignment(HorizontalAlignment.CENTER);  // 水平居中
        // 5. 设置垂直居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);  // 垂直居中
        return style;
    }

    /**
     * 将单元行中信息转为BillDTO
     * @param row
     * @param headerMap
     * @return
     */
    public static BillDTO parseBillFromRow(XSSFRow row, Map<String, Integer> headerMap) {
        BillDTO bill = new BillDTO();

        Integer typeCol = headerMap.get("类型");
        String typeValue = row.getCell(typeCol).getStringCellValue().trim();
        if (typeValue.equals("支出")) {
            bill.setType(BillStatus.EXPENSE);
        } else if (typeValue.equals("收入")) {
            bill.setType(BillStatus.INCOME);
        }

        Integer dateCol = headerMap.get("日期");
        Date date = row.getCell(dateCol).getDateCellValue();
        LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        bill.setDate(localDate);

        Integer amountCol = headerMap.get("金额");
        Double amount = row.getCell(amountCol).getNumericCellValue();
        bill.setAmount(amount);

        Integer categoryNameCol = headerMap.get("分类名称");
        String categoryName = row.getCell(categoryNameCol).getStringCellValue().trim();
        bill.setCategoryName(categoryName);

        Integer remarkCol = headerMap.get("描述");
        String remark = row.getCell(remarkCol).getStringCellValue().trim();
        bill.setRemark(remark);

        return bill;
    }
}
